<?php

namespace tools\lib;

class Create
{
    /**
     * @var Parameter
     */
    private $parameter = null;

    /**
     * Create constructor.
     * @param Parameter $parameter
     */
    public function __construct(Parameter $parameter)
    {
        $this->parameter = $parameter;
    }

    /**
     * @param Parameter $parameter
     * @return $this
     */
    public function setParameter(Parameter $parameter)
    {
        $this->parameter = $parameter;

        return $this;
    }

    /**
     * @return bool
     */
    public function start()
    {
        $type = $this->parameter->getType();
        $name = $this->parameter->getName();

        if (empty($type)) {
            dump('缺少-t|--type参数');
            return false;
        }

        if (empty($name)) {
            dump('缺少-n|--name参数');
            return false;
        }

        /**
         * 仓库中获取
         */
        if (is_dir('./tools/repository/' . $name)) {
            dump('仓库中有');
        }

        // 创建的模块主要从 extend(扩展) 或者main中获取
        $libs = [
            config('path.lib_main_path'),
            config('path.lib_extend_path'),
        ];

        $directory = '';
        foreach ($libs as $item) {
            // 泛匹配
            $directory = glob($item . $type . '*');
            if ($directory) {
                break;
            } else {
                $directory = '';
            }
        }

        if (!isset($directory[0]) && $directory[0]) {
            dump($directory . '创建的类型目录找不找到');
        }

        $directory = $directory[0];

        /**
         * 矫正目录,如 c,co,con可以匹配到controller,需要把type值矫正为controller
         *  m,mo,mode矫正为 model
         */
        $this->parameter->setType(substr($directory, strrpos($directory, '/') + 1));

        /**
         * 缺少从仓库中获取的代码
         */
        $files = glob($directory . '/*');

        foreach ($files as $file) {
            /**
             * 表示要创建的文件是 Constant,dictionary,controller等
             */
            $file_name = pathinfo($file, PATHINFO_FILENAME);

            /**
             * $file 是一个文件路径,如:
             *
             *  ./tools/lib/main/model/Constant.php
             *
             * 需要转化成命名空间使用
             *
             *  tools\lib\main\model\Constant
             *
             */
            $namespace = preg_replace(['/\.\//', '/\//', '/\.php/'], ['', '\\', ''], $file);

            /**
             * 当前项目下执行,没有tools目录
             */
            if (!preg_match('/tools/', $namespace)) {
                $namespace = 'tools\\' . $namespace;
            }

            if (class_exists($namespace)) {
                $this->parameter->setFileName($file_name);
                $class = new $namespace($this->parameter);
                // 写入文件
                if (method_exists($class, 'write')) {
                    $class->write();
                }
            } else {
                dump($namespace . '命名空间不存在' . ',file:create.php line:116');
            }
        }

        dump('操作完成');

        return true;
    }
}